package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

import co.gov.medellin.ssti.sub.common.util.FiltrosReportesUtil;
import co.gov.medellin.ssti.sub.model.dao.RepDetBOTDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.RepAtributoVO;
import co.gov.medellin.ssti.sub.model.vo.RepDetBOTVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteDetVO;

public class RepDetBOTDAOImpl2 extends NamedParameterJdbcDaoSupport implements
		RepDetBOTDAO {

	private static final String CALL_REPORTE_BENEFICIO_OTORGADO = "{call beneficios.PCS_REPORTE_BENEFICIO_OTORGADO(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}";

	private static final String CALL_REP_BENEFICIO_OTORGADOEG = "{call beneficios.PCS_REP_BENEFICIO_OTORGADOEG(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}";

	public Collection<ReporteDetVO> findReporte(
			List<RepAtributoVO> atributosGenericos,
			List<RepAtributoVO> atributosEspecificos,
			List<CondicionConsultaVO> filtros, RepDetBOTVO criteria)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		Collection<ReporteDetVO> beneficiarios = new LinkedList<ReporteDetVO>();
		List<RepAtributoVO> latributosEspecificos = atributosEspecificos;
		List<RepAtributoVO> latributosGenericos = atributosGenericos;
		RepAtributoVO atrVO = null;

		StringBuffer atriGenerales = new StringBuffer();
		StringBuffer atriEspecificos = new StringBuffer();
		StringBuffer codiEspecificos = new StringBuffer();
		String filtrosGenerales = checkFiltros(filtros);
		String filtrosEspecificos = null;
		if (criteria.getCodigoAtrGestor() != null
				&& criteria.getGestor() != null) {
			String checkFiltrosEspecificos;
			try {
				checkFiltrosEspecificos = checkFiltrosEspecificos(filtros);
			} catch (SQLException e) {
				throw new DAOException(e);
			}
			filtrosEspecificos = checkFiltrosEspecificos
					+ " AND NVL(Fcs_Ben_Valor_Atributo("
					+ criteria.getCodigoAtrGestor()
					+ ", "
					+ " bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') = TO_CHAR("
					+ criteria.getGestor() + ")";
		} else {
			try {
				filtrosEspecificos = checkFiltrosEspecificos(filtros);
			} catch (SQLException e) {
				throw new DAOException(e);
			}
		}

		final int sizeListAtriEsp = latributosEspecificos.size();
		String desde = criteria.getDesde();
		String hasta = criteria.getHasta();

		if (latributosGenericos.size() > 0) {
			for (int i = 0; i < latributosGenericos.size(); i++) {
				atrVO = (RepAtributoVO) latributosGenericos.get(i);
				atriGenerales.append(atrVO.getNombre() + "|");
			}
		}

		if (sizeListAtriEsp > 0) {
			for (int i = 0; i < sizeListAtriEsp; i++) {
				atrVO = (RepAtributoVO) latributosEspecificos.get(i);
				codiEspecificos.append(atrVO.getCodigo() + "|");
				atriEspecificos.append(" CAMPO" + (i + 1) + " ");
			}
		}

		// cs = conn.prepareCall(CALL_REPORTE_BENEFICIO_OTORGADO);
		/*
		 * String query = "{call beneficios.PCS_REPORTE_BENEFICIO_OTORGADO(?" +
		 * ", ?, ?," + filtrosGenerales + "," + filtrosEspecificos +
		 * ", ?, ?, ?, ?, ?)}"; cs = conn.prepareCall(query);
		 */

		final String strAtriGenerales = atriGenerales.toString();
		final String strCodiEspecificos = codiEspecificos.toString();
		final String strAtriEspecificos = atriEspecificos.toString();

		String strSql = "{call beneficios.PCS_REPORTE_BENEFICIO_OTORGADO("
				+ strAtriGenerales + ", " + sizeListAtriEsp + ", "
				+ strCodiEspecificos + "," + "" + filtrosGenerales + ","
				+ filtrosEspecificos + ", " + criteria.getCodeSede() + ", "
				+ criteria.getCodeSubprograma() + ", " + desde + ", " + hasta
				+ ", ?)}";

		// System.out.println(CALL_REPORTE_BENEFICIO_OTORGADO);
		System.out.println(strSql);

		namedParameters.put("CamposGenerales", strAtriGenerales);
		namedParameters.put("CamposEspecificos", sizeListAtriEsp);
		namedParameters.put("codigosCamposEspecificos", strCodiEspecificos);
		namedParameters.put("filtrosGenerales", filtrosGenerales);
		namedParameters.put("filtrosEspecificos", filtrosEspecificos);
		namedParameters.put("codigoSede", criteria.getCodeSede());
		namedParameters.put("codigoSub", criteria.getCodeSubprograma());
		namedParameters.put("fechaInicio", desde);
		namedParameters.put("fechaFinal", hasta);
		System.out.println(namedParameters.toString());

		SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS")
				.withProcedureName("PCS_REPORTE_BENEFICIO_OTORGADO")
				.returningResultSet("c_resultado",
						new RowMapper<ReporteDetVO>() {
							@Override
							public ReporteDetVO mapRow(ResultSet rs, int arg1)
									throws SQLException {
								ReporteDetVO vo = new ReporteDetVO();
								if (strAtriGenerales != null) {
									if (strAtriGenerales
											.indexOf("TIPO_DOCUMENTO") != -1) {
										vo.setTipoDocumento(rs
												.getString("TIPO_DOCUMENTO"));
									}
									if (strAtriGenerales
											.indexOf("NUMERO_DOCUMENTO") != -1) {
										vo.setNumeroDocumento(rs
												.getString("NUMERO_DOCUMENTO"));
									}
									if (strAtriGenerales
											.indexOf("PRIMER_NOMBRE") != -1) {
										vo.setPrimerNombre(rs
												.getString("PRIMER_NOMBRE"));
									}
									if (strAtriGenerales
											.indexOf("SEGUNDO_NOMBRE") != -1) {
										vo.setSegundoNombre(rs
												.getString("SEGUNDO_NOMBRE"));
									}
									if (strAtriGenerales
											.indexOf("PRIMER_APELLIDO") != -1) {
										vo.setPrimerApellido(rs
												.getString("PRIMER_APELLIDO"));
									}
									if (strAtriGenerales
											.indexOf("SEGUNDO_APELLIDO") != -1) {
										vo.setSegundoApellido(rs
												.getString("SEGUNDO_APELLIDO"));
									}
									if (strAtriGenerales
											.indexOf("DIRECCION_DESCRIPTIVA") != -1) {
										vo.setDirDescriptiva(rs
												.getString("DIRECCION_DESCRIPTIVA"));
									}
									if (strAtriGenerales
											.indexOf("DIRECCION_ENCASILLADA") != -1) {
										vo.setDirEncasillada(rs
												.getString("DIRECCION_ENCASILLADA"));
									}
									if (strAtriGenerales.indexOf("SEXO") != -1) {
										vo.setSexo(rs.getString("SEXO"));
									}
									if (strAtriGenerales
											.indexOf("FECHA_NACIMIENTO") != -1) {
										vo.setFechaNacimiento(rs
												.getString("FECHA_NACIMIENTO"));
									}
									if (strAtriGenerales
											.indexOf("VFL_CODIGO_COMUNA") != -1) {
										vo.setComunaCorregimiento(rs
												.getString("VFL_CODIGO_COMUNA"));
									}
									if (strAtriGenerales
											.indexOf("VFL_CODIGO_ZONA") != -1) {
										vo.setZona(rs
												.getString("VFL_CODIGO_ZONA"));
									}
									if (strAtriGenerales
											.indexOf("LOCALIZACION_COBAMA") != -1) {
										vo.setLocalizacion(rs
												.getString("LOCALIZACION_COBAMA"));
									}
									if (strAtriGenerales
											.indexOf("VFL_CODIGO_BARRIO") != -1) {
										vo.setBarrioVereda(rs
												.getString("VFL_CODIGO_BARRIO"));
									}
									if (strAtriGenerales.indexOf("TELEFONO") != -1) {
										vo.setTelefono(rs.getString("TELEFONO"));
									}
									if (strAtriGenerales.indexOf("ETNIA") != -1) {
										vo.setEtnia(rs.getString("ETNIA"));
									}
									if (strAtriGenerales
											.indexOf("CORREO_ELECTRONICO") != -1) {
										vo.setCorreElectronico(rs
												.getString("CORREO_ELECTRONICO"));
									}
									if (strAtriGenerales
											.indexOf("FICHA_SISBEN") != -1) {
										vo.setFichaSisben(rs
												.getString("FICHA_SISBEN"));
									}
									if (strAtriGenerales
											.indexOf("HOGAR_SISBEN") != -1) {
										vo.setHogarSisben(rs
												.getString("HOGAR_SISBEN"));
									}
									if (strAtriGenerales
											.indexOf("ORDEN_SISBEN") != -1) {
										vo.setOrdenSisben(rs
												.getString("ORDEN_SISBEN"));
									}
									if (strAtriGenerales
											.indexOf("NIVEL_SISBEN") != -1) {
										vo.setNivelSisben(rs
												.getString("NIVEL_SISBEN"));
									}
									if (strAtriGenerales
											.indexOf("PUNTAJE_SISBEN") != -1) {
										vo.setPuntajeSisben(rs
												.getString("PUNTAJE_SISBEN"));
									}
									if (strAtriGenerales
											.indexOf("FE_ENCUESTA_SISBEN") != -1) {
										vo.setFechaEncuesta(rs
												.getString("FE_ENCUESTA_SISBEN"));
									}
									if (strAtriGenerales
											.indexOf("DISCAPACIDAD_SISBEN") != -1) {
										vo.setDiscapacidad(rs
												.getString("DISCAPACIDAD_SISBEN"));
									}
									if (strAtriGenerales.indexOf("EDAD") != -1) {
										vo.setEdad(rs.getString("EDAD"));
									}
									if (strAtriGenerales
											.indexOf("HECHO_VICTIMIZANTE") != -1) {
										vo.setHechoVictimizante(rs
												.getString("HECHO_VICTIMIZANTE"));
									}
								}
								if (strCodiEspecificos != null) {
									/*
									 * La division en condicionales teniendo en
									 * cuenta el tamano de la lista de atributos
									 * especificos se hace con el objetivo de
									 * minimizar el numero de comparaciones
									 */
									if (sizeListAtriEsp <= 50
											|| sizeListAtriEsp >= 50) {
										if (strAtriEspecificos
												.indexOf("CAMPO1") != -1) {
											vo.setCampo1(rs.getString("CAMPO1"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO2") != -1) {
											vo.setCampo2(rs.getString("CAMPO2"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO3") != -1) {
											vo.setCampo3(rs.getString("CAMPO3"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO4") != -1) {
											vo.setCampo4(rs.getString("CAMPO4"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO5") != -1) {
											vo.setCampo5(rs.getString("CAMPO5"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO6") != -1) {
											vo.setCampo6(rs.getString("CAMPO6"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO7") != -1) {
											vo.setCampo7(rs.getString("CAMPO7"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO8") != -1) {
											vo.setCampo8(rs.getString("CAMPO8"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO9") != -1) {
											vo.setCampo9(rs.getString("CAMPO9"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO10") != -1) {
											vo.setCampo10(rs
													.getString("CAMPO10"));
										}

										if (sizeListAtriEsp > 10) {
											if (strAtriEspecificos
													.indexOf("CAMPO11") != -1) {
												vo.setCampo11(rs
														.getString("CAMPO11"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO12") != -1) {
												vo.setCampo12(rs
														.getString("CAMPO12"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO13") != -1) {
												vo.setCampo13(rs
														.getString("CAMPO13"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO14") != -1) {
												vo.setCampo14(rs
														.getString("CAMPO14"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO15") != -1) {
												vo.setCampo15(rs
														.getString("CAMPO15"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO16") != -1) {
												vo.setCampo16(rs
														.getString("CAMPO16"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO17") != -1) {
												vo.setCampo17(rs
														.getString("CAMPO17"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO18") != -1) {
												vo.setCampo18(rs
														.getString("CAMPO18"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO19") != -1) {
												vo.setCampo19(rs
														.getString("CAMPO19"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO20") != -1) {
												vo.setCampo20(rs
														.getString("CAMPO20"));
											}
										}
										if (sizeListAtriEsp > 20) {
											if (strAtriEspecificos
													.indexOf("CAMPO21") != -1) {
												vo.setCampo21(rs
														.getString("CAMPO21"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO22") != -1) {
												vo.setCampo22(rs
														.getString("CAMPO22"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO23") != -1) {
												vo.setCampo23(rs
														.getString("CAMPO23"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO24") != -1) {
												vo.setCampo24(rs
														.getString("CAMPO24"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO25") != -1) {
												vo.setCampo25(rs
														.getString("CAMPO25"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO26") != -1) {
												vo.setCampo26(rs
														.getString("CAMPO26"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO27") != -1) {
												vo.setCampo27(rs
														.getString("CAMPO27"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO28") != -1) {
												vo.setCampo28(rs
														.getString("CAMPO28"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO29") != -1) {
												vo.setCampo29(rs
														.getString("CAMPO29"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO30") != -1) {
												vo.setCampo30(rs
														.getString("CAMPO30"));
											}
										}
										if (sizeListAtriEsp > 30) {
											if (strAtriEspecificos
													.indexOf("CAMPO31") != -1) {
												vo.setCampo31(rs
														.getString("CAMPO31"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO32") != -1) {
												vo.setCampo32(rs
														.getString("CAMPO32"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO33") != -1) {
												vo.setCampo33(rs
														.getString("CAMPO33"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO34") != -1) {
												vo.setCampo34(rs
														.getString("CAMPO34"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO35") != -1) {
												vo.setCampo35(rs
														.getString("CAMPO35"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO36") != -1) {
												vo.setCampo36(rs
														.getString("CAMPO36"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO37") != -1) {
												vo.setCampo37(rs
														.getString("CAMPO37"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO38") != -1) {
												vo.setCampo38(rs
														.getString("CAMPO38"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO39") != -1) {
												vo.setCampo39(rs
														.getString("CAMPO39"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO40") != -1) {
												vo.setCampo40(rs
														.getString("CAMPO40"));
											}
										}
										if (sizeListAtriEsp > 40) {
											if (strAtriEspecificos
													.indexOf("CAMPO41") != -1) {
												vo.setCampo41(rs
														.getString("CAMPO41"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO42") != -1) {
												vo.setCampo42(rs
														.getString("CAMPO42"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO43") != -1) {
												vo.setCampo43(rs
														.getString("CAMPO43"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO44") != -1) {
												vo.setCampo44(rs
														.getString("CAMPO44"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO45") != -1) {
												vo.setCampo45(rs
														.getString("CAMPO45"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO46") != -1) {
												vo.setCampo46(rs
														.getString("CAMPO46"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO47") != -1) {
												vo.setCampo47(rs
														.getString("CAMPO47"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO48") != -1) {
												vo.setCampo48(rs
														.getString("CAMPO48"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO49") != -1) {
												vo.setCampo49(rs
														.getString("CAMPO49"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO50") != -1) {
												vo.setCampo50(rs
														.getString("CAMPO50"));
											}
										}
									}
									if (sizeListAtriEsp > 50) {
										if (strAtriEspecificos
												.indexOf("CAMPO51") != -1) {
											vo.setCampo51(rs
													.getString("CAMPO51"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO52") != -1) {
											vo.setCampo52(rs
													.getString("CAMPO52"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO53") != -1) {
											vo.setCampo53(rs
													.getString("CAMPO53"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO54") != -1) {
											vo.setCampo54(rs
													.getString("CAMPO54"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO55") != -1) {
											vo.setCampo55(rs
													.getString("CAMPO55"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO56") != -1) {
											vo.setCampo56(rs
													.getString("CAMPO56"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO57") != -1) {
											vo.setCampo57(rs
													.getString("CAMPO57"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO58") != -1) {
											vo.setCampo58(rs
													.getString("CAMPO58"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO59") != -1) {
											vo.setCampo59(rs
													.getString("CAMPO59"));
										}
										if (strAtriEspecificos
												.indexOf("CAMPO60") != -1) {
											vo.setCampo60(rs
													.getString("CAMPO60"));
										}

										if (sizeListAtriEsp > 60) {
											if (strAtriEspecificos
													.indexOf("CAMPO61") != -1) {
												vo.setCampo61(rs
														.getString("CAMPO61"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO62") != -1) {
												vo.setCampo62(rs
														.getString("CAMPO62"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO63") != -1) {
												vo.setCampo63(rs
														.getString("CAMPO63"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO64") != -1) {
												vo.setCampo64(rs
														.getString("CAMPO64"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO65") != -1) {
												vo.setCampo65(rs
														.getString("CAMPO65"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO66") != -1) {
												vo.setCampo66(rs
														.getString("CAMPO66"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO67") != -1) {
												vo.setCampo67(rs
														.getString("CAMPO67"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO68") != -1) {
												vo.setCampo68(rs
														.getString("CAMPO68"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO69") != -1) {
												vo.setCampo69(rs
														.getString("CAMPO69"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO70") != -1) {
												vo.setCampo70(rs
														.getString("CAMPO70"));
											}
										}
										if (sizeListAtriEsp > 70) {
											if (strAtriEspecificos
													.indexOf("CAMPO71") != -1) {
												vo.setCampo71(rs
														.getString("CAMPO71"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO72") != -1) {
												vo.setCampo72(rs
														.getString("CAMPO72"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO73") != -1) {
												vo.setCampo73(rs
														.getString("CAMPO73"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO74") != -1) {
												vo.setCampo74(rs
														.getString("CAMPO74"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO75") != -1) {
												vo.setCampo75(rs
														.getString("CAMPO75"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO76") != -1) {
												vo.setCampo76(rs
														.getString("CAMPO76"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO77") != -1) {
												vo.setCampo77(rs
														.getString("CAMPO77"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO78") != -1) {
												vo.setCampo78(rs
														.getString("CAMPO78"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO79") != -1) {
												vo.setCampo79(rs
														.getString("CAMPO79"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO80") != -1) {
												vo.setCampo80(rs
														.getString("CAMPO80"));
											}
										}
										if (sizeListAtriEsp > 80) {
											if (strAtriEspecificos
													.indexOf("CAMPO81") != -1) {
												vo.setCampo81(rs
														.getString("CAMPO81"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO82") != -1) {
												vo.setCampo82(rs
														.getString("CAMPO82"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO83") != -1) {
												vo.setCampo83(rs
														.getString("CAMPO83"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO84") != -1) {
												vo.setCampo84(rs
														.getString("CAMPO84"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO85") != -1) {
												vo.setCampo85(rs
														.getString("CAMPO85"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO86") != -1) {
												vo.setCampo86(rs
														.getString("CAMPO86"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO87") != -1) {
												vo.setCampo87(rs
														.getString("CAMPO87"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO88") != -1) {
												vo.setCampo88(rs
														.getString("CAMPO88"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO89") != -1) {
												vo.setCampo89(rs
														.getString("CAMPO89"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO90") != -1) {
												vo.setCampo90(rs
														.getString("CAMPO90"));
											}
										}
										if (sizeListAtriEsp > 90) {
											if (strAtriEspecificos
													.indexOf("CAMPO91") != -1) {
												vo.setCampo91(rs
														.getString("CAMPO91"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO92") != -1) {
												vo.setCampo92(rs
														.getString("CAMPO92"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO93") != -1) {
												vo.setCampo93(rs
														.getString("CAMPO93"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO94") != -1) {
												vo.setCampo94(rs
														.getString("CAMPO94"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO95") != -1) {
												vo.setCampo95(rs
														.getString("CAMPO95"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO96") != -1) {
												vo.setCampo96(rs
														.getString("CAMPO96"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO97") != -1) {
												vo.setCampo97(rs
														.getString("CAMPO97"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO98") != -1) {
												vo.setCampo98(rs
														.getString("CAMPO98"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO99") != -1) {
												vo.setCampo99(rs
														.getString("CAMPO99"));
											}
											if (strAtriEspecificos
													.indexOf("CAMPO100") != -1) {
												vo.setCampo100(rs
														.getString("CAMPO100"));
											}
										}
									}
								}

								vo.setFechaBeneficio(rs
										.getString("FECHA_BENEFICIO"));
								vo.setValor(rs.getInt("VALOR"));
								vo.setTercero(rs.getString("TERCERO"));

								// ADICION
								// ATRIBUTOS!!!!!----------------------------------------------------------
								vo.setTipoBeneficio(rs
										.getString("TIPO_BENEFICIO"));

								return vo;
							}

						});

		SqlParameterSource in = new MapSqlParameterSource()
				.addValues(namedParameters);
		Map<String, Object> out = jdbcCall.execute(in);

		@SuppressWarnings("unchecked")
		Collection<ReporteDetVO> ret = (ArrayList<ReporteDetVO>) out
				.get("c_resultado");

		return ret;

	}

	// TODO: test!
	public Collection<ReporteDetVO> findReporteConGestor(
			List<RepAtributoVO> atributosGenericos,
			List<RepAtributoVO> atributosEspecificos,
			List<CondicionConsultaVO> filtros, RepDetBOTVO criteria)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		Collection<ReporteDetVO> beneficiarios = new LinkedList<ReporteDetVO>();
		List<RepAtributoVO> latributosEspecificos = atributosEspecificos;
		List<RepAtributoVO> latributosGenericos = atributosGenericos;

		RepAtributoVO atrVO = null;

		StringBuffer atriGenerales = new StringBuffer();
		StringBuffer atriEspecificos = new StringBuffer();
		StringBuffer codiEspecificos = new StringBuffer();
		String filtrosGenerales = checkFiltros(filtros);
		String filtrosEspecificos = null;

		if (criteria.getCodigoAtrGestor() != null
				&& criteria.getGestor() != null) {
			String checkFiltrosEspecificos;
			try {
				checkFiltrosEspecificos = checkFiltrosEspecificos(filtros);
			} catch (SQLException e) {
				throw new DAOException(e);
			}
			// revisar prepared statement para esta parte.
			filtrosEspecificos = checkFiltrosEspecificos
					+ " AND NVL(Fcs_Ben_Valor_Atributo("
					+ criteria.getCodigoAtrGestor()
					+ ", "
					+ " bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') = TO_CHAR(''"
					+ criteria.getGestor() + "'')";
		} else {
			try {
				filtrosEspecificos = checkFiltrosEspecificos(filtros);
			} catch (SQLException e) {
				throw new DAOException(e);
			}
		}

		int sizeListAtriEsp = latributosEspecificos.size();
		String desde = criteria.getDesde();
		String hasta = criteria.getHasta();

		if (latributosGenericos.size() > 0) {
			for (int i = 0; i < latributosGenericos.size(); i++) {
				atrVO = (RepAtributoVO) latributosGenericos.get(i);
				atriGenerales.append(atrVO.getNombre() + "|");
			}
		}

		if (sizeListAtriEsp > 0) {
			for (int i = 0; i < sizeListAtriEsp; i++) {
				atrVO = (RepAtributoVO) latributosEspecificos.get(i);
				codiEspecificos.append(atrVO.getCodigo() + "|");
				atriEspecificos.append(" CAMPO" + (i + 1) + " ");
			}
		}

		try {
			String strCodiEspecificos = codiEspecificos.toString();
			String strAtriEspecificos = atriEspecificos.toString();
			String strAtriGenerales = atriGenerales.toString();

			SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(getDataSource())
					.withSchemaName("BENEFICIOS").withProcedureName(
							"PCS_REP_BENEFICIO_OTORGADOEG");
			namedParameters.put("CamposGenerales", strAtriGenerales);
			namedParameters.put("CamposEspecificos", sizeListAtriEsp);
			namedParameters.put("codigosCamposEspecificos", strCodiEspecificos);
			namedParameters.put("filtrosGenerales", filtrosGenerales);
			namedParameters.put("filtrosEspecificos", filtrosEspecificos);
			namedParameters.put("codigoSede", criteria.getCodeSede());
			namedParameters.put("codigoSub", criteria.getCodeSubprograma());
			namedParameters.put("fechaInicio", desde);
			namedParameters.put("fechaFinal", hasta);

			SqlParameterSource in = new MapSqlParameterSource(namedParameters);

			Map<String, Object> simpleJdbcCallResult = simpleJdbcCall
					.execute(in);
			ResultSet rst = (ResultSet) simpleJdbcCallResult.get("c_resultado");

			while (rst.next()) {
				ReporteDetVO reporteDetVO = new ReporteDetVO();
				if (strAtriGenerales != null) {
					if (strAtriGenerales.indexOf("TIPO_DOCUMENTO") != -1) {
						reporteDetVO.setTipoDocumento(rst
								.getString("TIPO_DOCUMENTO"));
					}
					if (strAtriGenerales.indexOf("NUMERO_DOCUMENTO") != -1) {
						reporteDetVO.setNumeroDocumento(rst
								.getString("NUMERO_DOCUMENTO"));
					}
					if (strAtriGenerales.indexOf("PRIMER_NOMBRE") != -1) {
						reporteDetVO.setPrimerNombre(rst
								.getString("PRIMER_NOMBRE"));
					}
					if (strAtriGenerales.indexOf("SEGUNDO_NOMBRE") != -1) {
						reporteDetVO.setSegundoNombre(rst
								.getString("SEGUNDO_NOMBRE"));
					}
					if (strAtriGenerales.indexOf("PRIMER_APELLIDO") != -1) {
						reporteDetVO.setPrimerApellido(rst
								.getString("PRIMER_APELLIDO"));
					}
					if (strAtriGenerales.indexOf("SEGUNDO_APELLIDO") != -1) {
						reporteDetVO.setSegundoApellido(rst
								.getString("SEGUNDO_APELLIDO"));
					}
					if (strAtriGenerales.indexOf("DIRECCION_DESCRIPTIVA") != -1) {
						reporteDetVO.setDirDescriptiva(rst
								.getString("DIRECCION_DESCRIPTIVA"));
					}
					if (strAtriGenerales.indexOf("DIRECCION_ENCASILLADA") != -1) {
						reporteDetVO.setDirEncasillada(rst
								.getString("DIRECCION_ENCASILLADA"));
					}
					if (strAtriGenerales.indexOf("SEXO") != -1) {
						reporteDetVO.setSexo(rst.getString("SEXO"));
					}
					if (strAtriGenerales.indexOf("FECHA_NACIMIENTO") != -1) {
						reporteDetVO.setFechaNacimiento(rst
								.getString("FECHA_NACIMIENTO"));
					}
					if (strAtriGenerales.indexOf("EDAD") != -1) {
						reporteDetVO.setEdad(rst.getString("EDAD"));
					}
					if (strAtriGenerales.indexOf("VFL_CODIGO_COMUNA") != -1) {
						reporteDetVO.setComunaCorregimiento(rst
								.getString("VFL_CODIGO_COMUNA"));
					}
					if (strAtriGenerales.indexOf("VFL_CODIGO_ZONA") != -1) {
						reporteDetVO.setZona(rst.getString("VFL_CODIGO_ZONA"));
					}
					if (strAtriGenerales.indexOf("LOCALIZACION_COBAMA") != -1) {
						reporteDetVO.setLocalizacion(rst
								.getString("LOCALIZACION_COBAMA"));
					}
					if (strAtriGenerales.indexOf("VFL_CODIGO_BARRIO") != -1) {
						reporteDetVO.setBarrioVereda(rst
								.getString("VFL_CODIGO_BARRIO"));
					}
					if (strAtriGenerales.indexOf("TELEFONO") != -1) {
						reporteDetVO.setTelefono(rst.getString("TELEFONO"));
					}
					if (strAtriGenerales.indexOf("ETNIA") != -1) {
						reporteDetVO.setEtnia(rst.getString("ETNIA"));
					}
					if (strAtriGenerales.indexOf("CORREO_ELECTRONICO") != -1) {
						reporteDetVO.setCorreElectronico(rst
								.getString("CORREO_ELECTRONICO"));
					}
					if (strAtriGenerales.indexOf("FICHA_SISBEN") != -1) {
						reporteDetVO.setFichaSisben(rst
								.getString("FICHA_SISBEN"));
					}
					if (strAtriGenerales.indexOf("HOGAR_SISBEN") != -1) {
						reporteDetVO.setHogarSisben(rst
								.getString("HOGAR_SISBEN"));
					}
					if (strAtriGenerales.indexOf("ORDEN_SISBEN") != -1) {
						reporteDetVO.setOrdenSisben(rst
								.getString("ORDEN_SISBEN"));
					}
					if (strAtriGenerales.indexOf("NIVEL_SISBEN") != -1) {
						reporteDetVO.setNivelSisben(rst
								.getString("NIVEL_SISBEN"));
					}
					if (strAtriGenerales.indexOf("PUNTAJE_SISBEN") != -1) {
						reporteDetVO.setPuntajeSisben(rst
								.getString("PUNTAJE_SISBEN"));
					}
					if (strAtriGenerales.indexOf("FE_ENCUESTA_SISBEN") != -1) {
						reporteDetVO.setFechaEncuesta(rst
								.getString("FE_ENCUESTA_SISBEN"));
					}
					if (strAtriGenerales.indexOf("DISCAPACIDAD_SISBEN") != -1) {
						reporteDetVO.setDiscapacidad(rst
								.getString("DISCAPACIDAD_SISBEN"));
					}
				}
				if (codiEspecificos != null) {
					/*
					 * La division en condicionales teniendo en cuenta el
					 * tamanio de la lista de atributos especificos se hace con
					 * el objetivo de minimizar el numero de comparaciones
					 */
					if (sizeListAtriEsp <= 50 || sizeListAtriEsp >= 50) {
						if (strAtriEspecificos.indexOf("CAMPO1") != -1) {
							reporteDetVO.setCampo1(rst.getString("CAMPO1"));
						}
						if (strAtriEspecificos.indexOf("CAMPO2") != -1) {
							reporteDetVO.setCampo2(rst.getString("CAMPO2"));
						}
						if (strAtriEspecificos.indexOf("CAMPO3") != -1) {
							reporteDetVO.setCampo3(rst.getString("CAMPO3"));
						}
						if (strAtriEspecificos.indexOf("CAMPO4") != -1) {
							reporteDetVO.setCampo4(rst.getString("CAMPO4"));
						}
						if (strAtriEspecificos.indexOf("CAMPO5") != -1) {
							reporteDetVO.setCampo5(rst.getString("CAMPO5"));
						}
						if (strAtriEspecificos.indexOf("CAMPO6") != -1) {
							reporteDetVO.setCampo6(rst.getString("CAMPO6"));
						}
						if (strAtriEspecificos.indexOf("CAMPO7") != -1) {
							reporteDetVO.setCampo7(rst.getString("CAMPO7"));
						}
						if (strAtriEspecificos.indexOf("CAMPO8") != -1) {
							reporteDetVO.setCampo8(rst.getString("CAMPO8"));
						}
						if (strAtriEspecificos.indexOf("CAMPO9") != -1) {
							reporteDetVO.setCampo9(rst.getString("CAMPO9"));
						}
						if (strAtriEspecificos.indexOf("CAMPO10") != -1) {
							reporteDetVO.setCampo10(rst.getString("CAMPO10"));
						}

						if (sizeListAtriEsp > 10) {
							if (strAtriEspecificos.indexOf("CAMPO11") != -1) {
								reporteDetVO.setCampo11(rst
										.getString("CAMPO11"));
							}
							if (strAtriEspecificos.indexOf("CAMPO12") != -1) {
								reporteDetVO.setCampo12(rst
										.getString("CAMPO12"));
							}
							if (strAtriEspecificos.indexOf("CAMPO13") != -1) {
								reporteDetVO.setCampo13(rst
										.getString("CAMPO13"));
							}
							if (strAtriEspecificos.indexOf("CAMPO14") != -1) {
								reporteDetVO.setCampo14(rst
										.getString("CAMPO14"));
							}
							if (strAtriEspecificos.indexOf("CAMPO15") != -1) {
								reporteDetVO.setCampo15(rst
										.getString("CAMPO15"));
							}
							if (strAtriEspecificos.indexOf("CAMPO16") != -1) {
								reporteDetVO.setCampo16(rst
										.getString("CAMPO16"));
							}
							if (strAtriEspecificos.indexOf("CAMPO17") != -1) {
								reporteDetVO.setCampo17(rst
										.getString("CAMPO17"));
							}
							if (strAtriEspecificos.indexOf("CAMPO18") != -1) {
								reporteDetVO.setCampo18(rst
										.getString("CAMPO18"));
							}
							if (strAtriEspecificos.indexOf("CAMPO19") != -1) {
								reporteDetVO.setCampo19(rst
										.getString("CAMPO19"));
							}
							if (strAtriEspecificos.indexOf("CAMPO20") != -1) {
								reporteDetVO.setCampo20(rst
										.getString("CAMPO20"));
							}
						}
						if (sizeListAtriEsp > 20) {
							if (strAtriEspecificos.indexOf("CAMPO21") != -1) {
								reporteDetVO.setCampo21(rst
										.getString("CAMPO21"));
							}
							if (strAtriEspecificos.indexOf("CAMPO22") != -1) {
								reporteDetVO.setCampo22(rst
										.getString("CAMPO22"));
							}
							if (strAtriEspecificos.indexOf("CAMPO23") != -1) {
								reporteDetVO.setCampo23(rst
										.getString("CAMPO23"));
							}
							if (strAtriEspecificos.indexOf("CAMPO24") != -1) {
								reporteDetVO.setCampo24(rst
										.getString("CAMPO24"));
							}
							if (strAtriEspecificos.indexOf("CAMPO25") != -1) {
								reporteDetVO.setCampo25(rst
										.getString("CAMPO25"));
							}
							if (strAtriEspecificos.indexOf("CAMPO26") != -1) {
								reporteDetVO.setCampo26(rst
										.getString("CAMPO26"));
							}
							if (strAtriEspecificos.indexOf("CAMPO27") != -1) {
								reporteDetVO.setCampo27(rst
										.getString("CAMPO27"));
							}
							if (strAtriEspecificos.indexOf("CAMPO28") != -1) {
								reporteDetVO.setCampo28(rst
										.getString("CAMPO28"));
							}
							if (strAtriEspecificos.indexOf("CAMPO29") != -1) {
								reporteDetVO.setCampo29(rst
										.getString("CAMPO29"));
							}
							if (strAtriEspecificos.indexOf("CAMPO30") != -1) {
								reporteDetVO.setCampo30(rst
										.getString("CAMPO30"));
							}
						}
						if (sizeListAtriEsp > 30) {
							if (strAtriEspecificos.indexOf("CAMPO31") != -1) {
								reporteDetVO.setCampo31(rst
										.getString("CAMPO31"));
							}
							if (strAtriEspecificos.indexOf("CAMPO32") != -1) {
								reporteDetVO.setCampo32(rst
										.getString("CAMPO32"));
							}
							if (strAtriEspecificos.indexOf("CAMPO33") != -1) {
								reporteDetVO.setCampo33(rst
										.getString("CAMPO33"));
							}
							if (strAtriEspecificos.indexOf("CAMPO34") != -1) {
								reporteDetVO.setCampo34(rst
										.getString("CAMPO34"));
							}
							if (strAtriEspecificos.indexOf("CAMPO35") != -1) {
								reporteDetVO.setCampo35(rst
										.getString("CAMPO35"));
							}
							if (strAtriEspecificos.indexOf("CAMPO36") != -1) {
								reporteDetVO.setCampo36(rst
										.getString("CAMPO36"));
							}
							if (strAtriEspecificos.indexOf("CAMPO37") != -1) {
								reporteDetVO.setCampo37(rst
										.getString("CAMPO37"));
							}
							if (strAtriEspecificos.indexOf("CAMPO38") != -1) {
								reporteDetVO.setCampo38(rst
										.getString("CAMPO38"));
							}
							if (strAtriEspecificos.indexOf("CAMPO39") != -1) {
								reporteDetVO.setCampo39(rst
										.getString("CAMPO39"));
							}
							if (strAtriEspecificos.indexOf("CAMPO40") != -1) {
								reporteDetVO.setCampo40(rst
										.getString("CAMPO40"));
							}
						}
						if (sizeListAtriEsp > 40) {
							if (strAtriEspecificos.indexOf("CAMPO41") != -1) {
								reporteDetVO.setCampo41(rst
										.getString("CAMPO41"));
							}
							if (strAtriEspecificos.indexOf("CAMPO42") != -1) {
								reporteDetVO.setCampo42(rst
										.getString("CAMPO42"));
							}
							if (strAtriEspecificos.indexOf("CAMPO43") != -1) {
								reporteDetVO.setCampo43(rst
										.getString("CAMPO43"));
							}
							if (strAtriEspecificos.indexOf("CAMPO44") != -1) {
								reporteDetVO.setCampo44(rst
										.getString("CAMPO44"));
							}
							if (strAtriEspecificos.indexOf("CAMPO45") != -1) {
								reporteDetVO.setCampo45(rst
										.getString("CAMPO45"));
							}
							if (strAtriEspecificos.indexOf("CAMPO46") != -1) {
								reporteDetVO.setCampo46(rst
										.getString("CAMPO46"));
							}
							if (strAtriEspecificos.indexOf("CAMPO47") != -1) {
								reporteDetVO.setCampo47(rst
										.getString("CAMPO47"));
							}
							if (strAtriEspecificos.indexOf("CAMPO48") != -1) {
								reporteDetVO.setCampo48(rst
										.getString("CAMPO48"));
							}
							if (strAtriEspecificos.indexOf("CAMPO49") != -1) {
								reporteDetVO.setCampo49(rst
										.getString("CAMPO49"));
							}
							if (strAtriEspecificos.indexOf("CAMPO50") != -1) {
								reporteDetVO.setCampo50(rst
										.getString("CAMPO50"));
							}
						}
					}
					if (sizeListAtriEsp > 50) {
						if (strAtriEspecificos.indexOf("CAMPO51") != -1) {
							reporteDetVO.setCampo51(rst.getString("CAMPO51"));
						}
						if (strAtriEspecificos.indexOf("CAMPO52") != -1) {
							reporteDetVO.setCampo52(rst.getString("CAMPO52"));
						}
						if (strAtriEspecificos.indexOf("CAMPO53") != -1) {
							reporteDetVO.setCampo53(rst.getString("CAMPO53"));
						}
						if (strAtriEspecificos.indexOf("CAMPO54") != -1) {
							reporteDetVO.setCampo54(rst.getString("CAMPO54"));
						}
						if (strAtriEspecificos.indexOf("CAMPO55") != -1) {
							reporteDetVO.setCampo55(rst.getString("CAMPO55"));
						}
						if (strAtriEspecificos.indexOf("CAMPO56") != -1) {
							reporteDetVO.setCampo56(rst.getString("CAMPO56"));
						}
						if (strAtriEspecificos.indexOf("CAMPO57") != -1) {
							reporteDetVO.setCampo57(rst.getString("CAMPO57"));
						}
						if (strAtriEspecificos.indexOf("CAMPO58") != -1) {
							reporteDetVO.setCampo58(rst.getString("CAMPO58"));
						}
						if (strAtriEspecificos.indexOf("CAMPO59") != -1) {
							reporteDetVO.setCampo59(rst.getString("CAMPO59"));
						}
						if (strAtriEspecificos.indexOf("CAMPO60") != -1) {
							reporteDetVO.setCampo60(rst.getString("CAMPO60"));
						}

						if (sizeListAtriEsp > 60) {
							if (strAtriEspecificos.indexOf("CAMPO61") != -1) {
								reporteDetVO.setCampo61(rst
										.getString("CAMPO61"));
							}
							if (strAtriEspecificos.indexOf("CAMPO62") != -1) {
								reporteDetVO.setCampo62(rst
										.getString("CAMPO62"));
							}
							if (strAtriEspecificos.indexOf("CAMPO63") != -1) {
								reporteDetVO.setCampo63(rst
										.getString("CAMPO63"));
							}
							if (strAtriEspecificos.indexOf("CAMPO64") != -1) {
								reporteDetVO.setCampo64(rst
										.getString("CAMPO64"));
							}
							if (strAtriEspecificos.indexOf("CAMPO65") != -1) {
								reporteDetVO.setCampo65(rst
										.getString("CAMPO65"));
							}
							if (strAtriEspecificos.indexOf("CAMPO66") != -1) {
								reporteDetVO.setCampo66(rst
										.getString("CAMPO66"));
							}
							if (strAtriEspecificos.indexOf("CAMPO67") != -1) {
								reporteDetVO.setCampo67(rst
										.getString("CAMPO67"));
							}
							if (strAtriEspecificos.indexOf("CAMPO68") != -1) {
								reporteDetVO.setCampo68(rst
										.getString("CAMPO68"));
							}
							if (strAtriEspecificos.indexOf("CAMPO69") != -1) {
								reporteDetVO.setCampo69(rst
										.getString("CAMPO69"));
							}
							if (strAtriEspecificos.indexOf("CAMPO70") != -1) {
								reporteDetVO.setCampo70(rst
										.getString("CAMPO70"));
							}
						}
						if (sizeListAtriEsp > 70) {
							if (strAtriEspecificos.indexOf("CAMPO71") != -1) {
								reporteDetVO.setCampo71(rst
										.getString("CAMPO71"));
							}
							if (strAtriEspecificos.indexOf("CAMPO72") != -1) {
								reporteDetVO.setCampo72(rst
										.getString("CAMPO72"));
							}
							if (strAtriEspecificos.indexOf("CAMPO73") != -1) {
								reporteDetVO.setCampo73(rst
										.getString("CAMPO73"));
							}
							if (strAtriEspecificos.indexOf("CAMPO74") != -1) {
								reporteDetVO.setCampo74(rst
										.getString("CAMPO74"));
							}
							if (strAtriEspecificos.indexOf("CAMPO75") != -1) {
								reporteDetVO.setCampo75(rst
										.getString("CAMPO75"));
							}
							if (strAtriEspecificos.indexOf("CAMPO76") != -1) {
								reporteDetVO.setCampo76(rst
										.getString("CAMPO76"));
							}
							if (strAtriEspecificos.indexOf("CAMPO77") != -1) {
								reporteDetVO.setCampo77(rst
										.getString("CAMPO77"));
							}
							if (strAtriEspecificos.indexOf("CAMPO78") != -1) {
								reporteDetVO.setCampo78(rst
										.getString("CAMPO78"));
							}
							if (strAtriEspecificos.indexOf("CAMPO79") != -1) {
								reporteDetVO.setCampo79(rst
										.getString("CAMPO79"));
							}
							if (strAtriEspecificos.indexOf("CAMPO80") != -1) {
								reporteDetVO.setCampo80(rst
										.getString("CAMPO80"));
							}
						}
						if (sizeListAtriEsp > 80) {
							if (strAtriEspecificos.indexOf("CAMPO81") != -1) {
								reporteDetVO.setCampo81(rst
										.getString("CAMPO81"));
							}
							if (strAtriEspecificos.indexOf("CAMPO82") != -1) {
								reporteDetVO.setCampo82(rst
										.getString("CAMPO82"));
							}
							if (strAtriEspecificos.indexOf("CAMPO83") != -1) {
								reporteDetVO.setCampo83(rst
										.getString("CAMPO83"));
							}
							if (strAtriEspecificos.indexOf("CAMPO84") != -1) {
								reporteDetVO.setCampo84(rst
										.getString("CAMPO84"));
							}
							if (strAtriEspecificos.indexOf("CAMPO85") != -1) {
								reporteDetVO.setCampo85(rst
										.getString("CAMPO85"));
							}
							if (strAtriEspecificos.indexOf("CAMPO86") != -1) {
								reporteDetVO.setCampo86(rst
										.getString("CAMPO86"));
							}
							if (strAtriEspecificos.indexOf("CAMPO87") != -1) {
								reporteDetVO.setCampo87(rst
										.getString("CAMPO87"));
							}
							if (strAtriEspecificos.indexOf("CAMPO88") != -1) {
								reporteDetVO.setCampo88(rst
										.getString("CAMPO88"));
							}
							if (strAtriEspecificos.indexOf("CAMPO89") != -1) {
								reporteDetVO.setCampo89(rst
										.getString("CAMPO89"));
							}
							if (strAtriEspecificos.indexOf("CAMPO90") != -1) {
								reporteDetVO.setCampo90(rst
										.getString("CAMPO90"));
							}
						}
						if (sizeListAtriEsp > 90) {
							if (strAtriEspecificos.indexOf("CAMPO91") != -1) {
								reporteDetVO.setCampo91(rst
										.getString("CAMPO91"));
							}
							if (strAtriEspecificos.indexOf("CAMPO92") != -1) {
								reporteDetVO.setCampo92(rst
										.getString("CAMPO92"));
							}
							if (strAtriEspecificos.indexOf("CAMPO93") != -1) {
								reporteDetVO.setCampo93(rst
										.getString("CAMPO93"));
							}
							if (strAtriEspecificos.indexOf("CAMPO94") != -1) {
								reporteDetVO.setCampo94(rst
										.getString("CAMPO94"));
							}
							if (strAtriEspecificos.indexOf("CAMPO95") != -1) {
								reporteDetVO.setCampo95(rst
										.getString("CAMPO95"));
							}
							if (strAtriEspecificos.indexOf("CAMPO96") != -1) {
								reporteDetVO.setCampo96(rst
										.getString("CAMPO96"));
							}
							if (strAtriEspecificos.indexOf("CAMPO97") != -1) {
								reporteDetVO.setCampo97(rst
										.getString("CAMPO97"));
							}
							if (strAtriEspecificos.indexOf("CAMPO98") != -1) {
								reporteDetVO.setCampo98(rst
										.getString("CAMPO98"));
							}
							if (strAtriEspecificos.indexOf("CAMPO99") != -1) {
								reporteDetVO.setCampo99(rst
										.getString("CAMPO99"));
							}
							if (strAtriEspecificos.indexOf("CAMPO100") != -1) {
								reporteDetVO.setCampo100(rst
										.getString("CAMPO100"));
							}
						}
					}
				}
				reporteDetVO
						.setFechaBeneficio(rst.getString("FECHA_BENEFICIO"));
				// reporteDetVO.setFechaBeneficio(rst.getString("TIPO_BENEFICIO"));
				reporteDetVO.setTipoBeneficio(rst.getString("TIPO_BENEFICIO"));
				reporteDetVO.setValor(rst.getInt("VALOR"));
				reporteDetVO.setEdad(rst.getString("EDAD"));

				beneficiarios.add(reporteDetVO);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		}
		return beneficiarios;
	}

	public Integer findCantidadBeneficiarios(List<CondicionConsultaVO> filtros,
			RepDetBOTVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String filtrosGenerales = checkFiltros((Collection<CondicionConsultaVO>) filtros);
		String filtrosEspecificos = null;
		if (criteria.getCodigoAtrGestor() != null
				&& criteria.getGestor() != null) {
			try {
				filtrosEspecificos = checkFiltrosEspecificos((Collection<CondicionConsultaVO>) filtros)
						+ " AND NVL(Fcs_Ben_Valor_Atributo("
						+ criteria.getCodigoAtrGestor()
						+ ", "
						+ " bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') = TO_CHAR('"
						+ criteria.getGestor() + "')";
			} catch (Exception e) {
				throw new DAOException(e);
			}
		} else {
			try {
				filtrosEspecificos = checkFiltrosEspecificos((Collection<CondicionConsultaVO>) filtros);
			} catch (Exception e) {
				throw new DAOException(e);
			}
		}

		String desde = criteria.getDesde();
		String hasta = criteria.getHasta();

		/*
		 * String strSql = "{call beneficios.PCS_CANTIDAD_BENEFICIARIOS(" + "" +
		 * filtrosGenerales + "," + filtrosEspecificos + ", " +
		 * criteria.getCodeSede() + ", " + criteria.getCodeSubprograma() +
		 * ", null, " + desde + ", " + hasta + ", ?)}";
		 */

		namedParameters.put("filtrosGenerales", filtrosGenerales);
		namedParameters.put("filtrosEspecificos", filtrosEspecificos);
		namedParameters.put("codigoSede", criteria.getCodeSede());
		namedParameters.put("codigoSub", criteria.getCodeSubprograma());
		namedParameters.put("codigoProg", null);
		namedParameters.put("fechaInicio", desde);
		namedParameters.put("fechaFinal", hasta);

		SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(getJdbcTemplate())
				.withSchemaName("BENEFICIOS")
				.withProcedureName("PCS_CANTIDAD_BENEFICIARIOS")
				.returningResultSet("c_resultado", new RowMapper<Integer>() {

					@Override
					public Integer mapRow(ResultSet rs, int arg1)
							throws SQLException {
						return rs.getInt(1);
					}

				});
		SqlParameterSource in = new MapSqlParameterSource()
				.addValues(namedParameters);
		Map<String, Object> out = simpleJdbcCall.execute(in);

		@SuppressWarnings("unchecked")
		Collection<Integer> ret = (ArrayList<Integer>) out.get("c_resultado");
		if (ret != null && !ret.isEmpty()) {
			return ret.iterator().next();
		}
		return null;
	}

	public Long findValorTotal(List<CondicionConsultaVO> filtros,
			RepDetBOTVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String filtrosGenerales = checkFiltros((Collection<CondicionConsultaVO>) filtros);
		String filtrosEspecificos = null;
		if (criteria.getCodigoAtrGestor() != null
				&& criteria.getGestor() != null) {
			try {
				filtrosEspecificos = checkFiltrosEspecificos((Collection<CondicionConsultaVO>) filtros)
						+ " AND NVL(Fcs_Ben_Valor_Atributo("
						+ criteria.getCodigoAtrGestor()
						+ ", "
						+ " bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') = TO_CHAR('"
						+ criteria.getGestor() + "')";
			} catch (Exception e) {
				throw new DAOException(e);
			}
		} else {
			try {
				filtrosEspecificos = checkFiltrosEspecificos((Collection<CondicionConsultaVO>) filtros);
			} catch (Exception e) {
				throw new DAOException(e);
			}
		}

		String desde = criteria.getDesde();
		String hasta = criteria.getHasta();

		namedParameters.put("filtrosGenerales", filtrosGenerales);
		namedParameters.put("filtrosEspecificos", filtrosEspecificos);
		namedParameters.put("codigoSede", criteria.getCodeSede());
		namedParameters.put("codigoSub", criteria.getCodeSubprograma());
		namedParameters.put("codigoProg", null);
		namedParameters.put("fechaInicio", desde);
		namedParameters.put("fechaFinal", hasta);

		SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS")
				.withProcedureName("PCS_VALOR_BENEFICIOS")
				.returningResultSet("c_resultado", new RowMapper<Long>() {

					@Override
					public Long mapRow(ResultSet rs, int arg1)
							throws SQLException {
						return rs.getLong(1);
					}

				});

		SqlParameterSource in = new MapSqlParameterSource(namedParameters);
		Map<String, Object> out = simpleJdbcCall.execute(in);

		@SuppressWarnings("unchecked")
		Collection<Long> ret = (ArrayList<Long>) out.get("c_resultado");
		if (ret != null && !ret.isEmpty()) {
			return ret.iterator().next();
		}
		return null;

		/*
		 * String strSql = "{call beneficios.PCS_VALOR_BENEFICIOS(" + "" +
		 * filtrosGenerales + "," + filtrosEspecificos + ", " +
		 * criteria.getCodeSede() + ", " + criteria.getCodeSubprograma() +
		 * ", null, " + desde + ", " + hasta + ", ?)}";
		 */
		// Long ret = null;
		// try {
		// if (rst.next()) {
		// ret = Long.valueOf(rst.getLong(1));
		// }
		// return ret;
		// } catch (Exception e) {
		// throw new DAOException(e);
		// }
	}

	public RepDetBOTVO findFilters(RepDetBOTVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		String strQuery = null;

		if (criteria.getCodeSede() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_SEDE "
					+ " WHERE CODIGO = :CODIGO ";
			namedParameters.put("CODIGO", criteria.getCodeSede());
			try {
				String nombre = getNamedParameterJdbcTemplate().queryForObject(
						strQuery, namedParameters, String.class);
				criteria.setNombreSede(nombre);
			} catch (IncorrectResultSizeDataAccessException e) {
				// TODO: handle exception
			}
		}

		if (criteria.getCodeSubprograma() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_SUBPROGRAMA"
					+ " WHERE CODIGO = :CODIGO ";
			namedParameters.clear();
			namedParameters.put("CODIGO", criteria.getCodeSubprograma());
			try {
				String nombre = getNamedParameterJdbcTemplate().queryForObject(
						strQuery, namedParameters, String.class);
				criteria.setNombreSubprograma(nombre);
			} catch (IncorrectResultSizeDataAccessException e) {
				// TODO: handle exception
			}

			strQuery = "SELECT prog.NOMBRE NOMBRE"
					+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog"
					+ " WHERE sub.prg_codigo = prog.CODIGO "
					+ " AND sub.CODIGO = :CODIGO ";
			namedParameters.clear();
			namedParameters.put("CODIGO", criteria.getCodeSubprograma());
			try {
				String name = getNamedParameterJdbcTemplate().queryForObject(
						strQuery, namedParameters, String.class);
				criteria.setNombrePrograma(name);
			} catch (IncorrectResultSizeDataAccessException e) {
				// TODO: handle exception
			}
		}
		return criteria;
	}

	private String checkFiltros(Collection<CondicionConsultaVO> filtros) {
		List<CondicionConsultaVO> lFiltros = (List<CondicionConsultaVO>) filtros;
		CondicionConsultaVO filtro = null;
		StringBuffer retorno = new StringBuffer();
		if ((Object) filtros != null) {
			for (int i = 0; i < lFiltros.size(); i++) {
				filtro = (CondicionConsultaVO) lFiltros.get(i);
				String operador = filtro.getCodFiltro();
				String tipoDato = filtro.getTipoCampo();

				if (filtro.getOrigen().equals("G")) {
					retorno.append(" AND ");
					if (tipoDato.equals("N")) {
						String prefijoTabla;
						if (filtro.getCodcampo().equalsIgnoreCase(
								FiltrosReportesUtil.HECHO_VICTIMIZANTE)) {
							prefijoTabla = " bot.";
						} else {
							prefijoTabla = " ben.";
						}
						if (operador.equals("=")) {
							retorno.append(prefijoTabla + filtro.getCodcampo()
									+ " " + operador + " " + filtro.getValor());
						} else if (operador.equals("<>")) {
							retorno.append(prefijoTabla + filtro.getCodcampo()
									+ " " + operador + " " + filtro.getValor());
						} else if (operador.equals("<=")) {
							retorno.append(prefijoTabla + filtro.getCodcampo()
									+ " " + operador + " " + filtro.getValor());
						} else if (operador.equals(">=")) {
							retorno.append(prefijoTabla + filtro.getCodcampo()
									+ " " + operador + " " + filtro.getValor());
						} else if (operador.equals("<")) {
							retorno.append(prefijoTabla + filtro.getCodcampo()
									+ " " + operador + " " + filtro.getValor());
						} else if (operador.equals(">")) {
							retorno.append(prefijoTabla + filtro.getCodcampo()
									+ " " + operador + " " + filtro.getValor());
						} else {
							retorno.append(prefijoTabla + filtro.getCodcampo()
									+ " " + operador + " " + filtro.getValor()
									+ " AND " + filtro.getValor2());
						}

					} else if (tipoDato.equals("F")) {

						if (operador.equalsIgnoreCase("between")
								|| operador.equals("=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " to_date('"
									+ filtro.getValor()
									+ "', 'DD/MM/RRRR') and to_date('"
									+ filtro.getValor2() + "', 'DD/MM/RRRR')");

						} else {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " to_date('"
									+ filtro.getValor() + "', 'DD/MM/RRRR')");
						}

					} else if (tipoDato.equals("A") || tipoDato.equals("L")) {

						if (operador.equals("=")) {
							retorno.append(" UPPER(ben." + filtro.getCodcampo()
									+ " ) " + operador + " '"
									+ filtro.getValor().toUpperCase() + "'");
						} else if (operador.equals("<>")) {
							retorno.append(" UPPER(ben." + filtro.getCodcampo()
									+ " ) " + operador + " '"
									+ filtro.getValor().toUpperCase() + "'");
						} else if (operador.equalsIgnoreCase("like")) {
							retorno.append(" UPPER(ben." + filtro.getCodcampo()
									+ " ) " + operador + " '%"
									+ filtro.getValor().toUpperCase() + "%'");
						}

					} else {
						if (operador.equals("=")) {
							retorno.append(" ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals("<>")) {
							retorno.append(" ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals("<=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals(">=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals("<")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals(">")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor()
									+ "' and '" + filtro.getValor2() + "'");
						}
					}
				}
			}
		}
		if (!retorno.toString().isEmpty()) {
			retorno.append("");
		}
		return retorno.toString();
	}

	private String checkFiltrosEspecificos(
			Collection<CondicionConsultaVO> filtros) throws SQLException {
		List<CondicionConsultaVO> lFiltros = (List<CondicionConsultaVO>) filtros;
		CondicionConsultaVO filtro = null;
		StringBuffer retorno = new StringBuffer();
		if ((Object) filtros != null) {
			for (int i = 0; i < lFiltros.size(); i++) {
				filtro = (CondicionConsultaVO) lFiltros.get(i);
				if (filtro.getOrigen().equals("E")) {
					if (filtro.getCodFiltro().equals("=")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') = TO_CHAR(''"
								+ filtro.getValor().toUpperCase() + "'') ");
					} else if (filtro.getCodFiltro().equals("<>")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') <> TO_CHAR(''"
								+ filtro.getValor().toUpperCase() + "'') ");
					} else if (filtro.getCodFiltro().equals("<=")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') <= TO_CHAR(''"
								+ filtro.getValor() + "'') ");
					} else if (filtro.getCodFiltro().equals(">=")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') >= TO_CHAR(''"
								+ filtro.getValor() + "'') ");
					} else if (filtro.getCodFiltro().equals("<")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') < TO_CHAR(''"
								+ filtro.getValor() + "'') ");
					} else if (filtro.getCodFiltro().equals(">")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') > TO_CHAR(''"
								+ filtro.getValor() + "'') ");
					} else if (filtro.getCodFiltro()
							.equalsIgnoreCase("between")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') between TO_CHAR(''"
								+ filtro.getValor() + "'') AND TO_CHAR(''"
								+ filtro.getValor2() + "'')");
					} else if (filtro.getCodFiltro().equalsIgnoreCase("like")) {
						retorno.append(" AND NVL(Fcs_Ben_Valor_Atributo("
								+ filtro.getCodcampo()
								+ ", bot.codigo, ben.codigo, bot.FECHA_BENEFICIO),'' '') LIKE TO_CHAR(UPPER(''%"
								+ filtro.getValor() + "%''))");
					}
				}
			}
		}
		return retorno.toString();
	}

}
